package com.misyi.designpattern.facade;

/**
 * 外观模式(门面模式)
 *
 * @author licong
 * @date 2021-09-11 下午10:27
 */
public class FacadePatternDemo {

    public static void main(String[] args) {
        // 假设我们在子系统2中, 需要调用子系统 1 的三个模块的功能
        SystemFacade systemFacade = new SystemFacade();
        systemFacade.execute();

        // 好处1: 子系统2 不需要 care 太多的模块, 只要 care 一个门面类的接口就可以了
        // 好处2: 如果多个地方调用这个逻辑, 逻辑一旦变了, 只需要在子系统1进行修改, 子系统2只需要面向门面接口进行开发即可

        // 实际开发过程中:
        // service 组件就是一个经典的外观模式
        // 一个 service 封装了很多 dao 组件的方法, 对外暴露一个统一接口
    }

    /**
     * 子系统 1 的门面类
     */
    public static class SystemFacade {

        // 封装的门面方法
        public void execute() {
            // 封装了自己多个模块的功能, 对外统一暴露出一个功能
            ModuleA moduleA = new ModuleA();
            ModuleB moduleB = new ModuleB();
            ModuleC moduleC = new ModuleC();
            moduleA.execute();
            moduleB.execute();
            moduleC.execute();
            // 此时无论我们是要进行单个模块的功能修改, 还是针对 3 个模块统一的逻辑进行修改
            // 都不需要修改调用方的代码, 只用修改门面类的代码
            System.out.println("迭代中增加的逻辑");
        }
    }


    public static class ModuleA {

        public void execute() {
            System.out.println("子系统1的模块A的功能");
        }
    }

    public static class ModuleB {

        public void execute() {
            System.out.println("子系统1的模块B的功能");
        }
    }

    public static class ModuleC {

        public void execute() {
            System.out.println("子系统1的模块C的功能");
        }
    }

}
